package edu.uncc.cs.watsonsim.researchers; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang3.StringEscapeUtils; import edu.uncc.cs.watsonsim.Answer; import edu.uncc.cs.watsonsim.Database; import edu.uncc.cs.watsonsim.Environment; import edu.uncc.cs.watsonsim.Question; import edu.uncc.cs.watsonsim.Score; import edu.uncc.cs.watsonsim.scorers.Merge; /** * Create a bunch of new answers with the same passages based on "synonyms" * made from Wikipedia redirects. * * @author Sean */ public class RedirectSynonyms extends Researcher { private final Database db; private final PreparedStatement s; public RedirectSynonyms(Environment env) { db = env.db; s = db.prep("SELECT source from wiki_redirects where target = ?;"); Score.register("IS_WIKI_REDIRECT", 0.0, Merge.Min); } @Override public List<Answer> question(Question q, List<Answer> answers) { // For logging int synonym_count = 0; List<Answer> new_answers = new ArrayList<Answer>(); for (Answer a : answers) { try { s.setString(1, a.text); ResultSet results = s.executeQuery(); while (results.next()) { synonym_count++; Answer new_answer = new Answer( new ArrayList<>(a.passages), a.scores.clone(), StringEscapeUtils.unescapeXml(results.getString("source"))); a.scores.put("IS_WIKI_REDIRECT", 1.0); new_answers.add(new_answer); } } catch (SQLException e) { // Just don't make any synonyms. return answers; } } log.info("Found " + synonym_count + " synonyms for " + answers.size() + " candidate answers using Wikipedia redirects."); return new_answers; } }